<?php  
/** 
 * Thumbnail Generator for CakePHP that uses phpThumb (http://phpthumb.sourceforge.net/) 
 * 
 * @package default 
 * @author Nate Constant 
 **/  
 
App::uses('Component', 'Controller');
App::uses('AclUtil', 'Lib');

class PermissionComponent extends Component{
     
	 /*
	  * questo componente permette di creare un array contenente tutti i permessi configurati ACL component
	  * ed inserirlo in sessione tale array potra essere successivamente utilizzato da PermissionHelper nelle viste
	  * si consiglia di utilizzarlo dopo le chiamate login e logout del componente Auth per poter aggionare e rimuovere
	  * il suddetto array.
	  * 
	  * */

    /** 
     * Array of errors 
     */ 
    var $errors = array(); 

    var $controller; 
    var $model; 
     
	var	$permissions = array();
	
    function startup( &$controller ) { 
      $this->controller = &$controller; 
    } 

	function initialize() {
		
	}
	
	function beforeRender() {
		
	}
	
	function shutdown() {
		
	}
	
	private function readGroupUserPermission($model, $id) {
		    $aros = $this->controller->Acl->Aro->find('all', array(
		        'conditions' => array(
		            'Aro.model' => $model,
		            'Aro.foreign_key' => $id,
		        ),
		    ));
			foreach ($aros as $key => $aro_acos) {
				//do lo stesso permesso a tutti gli oggetti aco figli del gruppo				
				foreach ($aro_acos["Aco"] as $aco) {
					// print_r($aco);
					$acoParent=$aco["parent_id"];
					$acoParentAlias=AclUtil::getAcoParentAlias($this->controller, $acoParent); //esempio controllers/Users
					$acoPermission=0;
					// verifico permessi assengati al gruppo
				    if(isset($aco['Permission']['id'])){
				        if ($aco['Permission']['_create'] == 1 || $aco['Permission']['_read'] == 1 ||
				            $aco['Permission']['_update'] == 1 || $aco['Permission']['_delete'] == 1) {
				            	$acoPermission=1;
						}
					}
					// cerco tutti gli Aco figli partendo dal padre
					$acoChildrens = $this->controller->Acl->Aco->find('threaded', array('conditions'=>array('Aco.lft >='=>$aco['lft'], 'Aco.rght <=' => $aco['rght']),'recursive'=>0));
					// costruisce l'array $permissions dove la chiave è il path aco e il valore e 1 o 0 in base al grant
					$this->buildArrayPermission($acoChildrens,$acoPermission,$acoParentAlias);
				}
			}
	}

	private function readPermission($userId=null) {
		Controller::loadModel('User');
		$user = null;
		if ($userId) {
			$user = $this->User->findById($userId);
			$this->readGroupUserPermission("Group", $user['User']['group_id']);
			$this->readGroupUserPermission("User", $user['User']['id']);
		} else {
			$user = $this->controller->Auth->user();
			$this->readGroupUserPermission("Group", $user['group_id']);
			$this->readGroupUserPermission("User", $user['id']);
		}
		$this->controller->Session->write("permissions",$this->permissions);
	}

	private function buildArrayPermission($acoChildrens,$acoPermission,$parentAlias) {
		foreach ($acoChildrens as $aco) {
			// print_r($aco);die;
			$acoAlias=$aco["Aco"]["alias"];
			$key=NULL;
			if (isset($parentAlias)) {
				$key=$parentAlias."/".$acoAlias;
			} else {
				$key=$acoAlias;
			}
			$this->permissions[strtolower($key)]=$acoPermission;
			$this->buildArrayPermission($aco["children"],$acoPermission,$key);
		}		
	}	
	
	public function setPermissionToSession() {
		$this->readPermission();
	}	
	
	public function clearPermissionfromSession() {
		$this->controller->Session->delete('permissions');		
	}


} 
?>